# 本地环境npm打包后自动传到服务器

# 背景

在开发js工具库的时候,需要单独打包。

而且使用该库的环境的代码是直接跑在服务器上的,所以每次修改工具库的代码后都需要手动传到服务器上,实在耗时,于是研究了一下,使用了一套本地打包后自动上传到服务器的流程。

# 实现

# npm 的命令钩子

写在npm scripts中的命令,有前置钩子pre和后置钩子post

这里需要在打包后做处理,使用的是后置钩子,代码如下

"build:deploy": "npm run build:umd",
"postbuild:deploy": "node ./build/deploy/deploy.js",

在打包后会自动触发postbuild:deploy命令,执行deploy.js

# 上传

使用node-ssh进行上传

链接到服务器,上传文件,上传后清下服务器缓存。

/**
 * 打包后自动推送文件到服务器
 */
const { NodeSSH } = require('node-ssh');
const ssh = new NodeSSH();
const config = require('./config');

function uploadFile() {
  ssh.connect({
    host: config.host,
    username: config.username,
    password: config.password,
    port: config.port
  }).then(function () {
    // 上传网站的发布包至config中配置的远程服务器的指定地址
    ssh.putFile(config.localPath, config.remotePath).then(function(status) {
      console.log('上传文件成功');
      console.log('开始执行远端脚本');
      startRemoteShell();// 上传成功后触发远端脚本
    }).catch(err => {
      console.log('文件传输异常:', err);
      process.exit(0);
    });
  }).catch(err => {
    console.log('ssh连接失败:', err);
    process.exit(0);
  });
}

// 执行远端部署脚本
function startRemoteShell() {
  // 在服务器上cwd配置的路径下执行sh deploy.sh脚本来实现发布
  ssh.execCommand('清缓存命令').then(function(result) {
    // console.log('远程STDOUT输出: ' + result.stdout);
    // console.log('远程STDERR输出: ' + result.stderr);
    if (!result.stderr) {
      console.log('发布成功!');
      process.exit(0);
    }
  });
}

function start() {
  uploadFile();
}

start();

config.js

/**
 * config 存放的是连接远程机器的信息
 */
const path = require('path');

module.exports = {
  host: 'x.x.x.x',
  username: 'admin',
  password: 'admin',
  port: 8080,
  remotePath: '服务器上存放上传文件的位置',
  localPath: path.resolve(__dirname, '本地打包出的文件的位置')
};